home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Narzedzia / Aplikacje_64-bitowe / Daum_PotPlayer / PotPlayer1.5.29332-x64.EXE / PxShader / YV12 Chroma Upsampling.txt < prev   
Text File  |  2010-05-20  |  2KB  |  77 lines

  1. /*
  2. YV12 chroma upsampling fixer
  3. by Kurt Bernhard 'Leak' Pruenner
  4.  
  5. Use with YV12 output if the half-resolution chroma 
  6. gets upsampled in hardware by doubling the values
  7. instead of interpolating between them.
  8.  
  9. (i.e. if you're getting blocky red edges on dark 
  10. backgrounds...)
  11. */
  12.  
  13. sampler s0 : register(s0);
  14. float4 p0 : register(c0);
  15. float4 p1 : register(c1);
  16.  
  17. #define width (p0[0])
  18. #define height (p0[1])
  19.  
  20. float4 getPixel(float2 tex, float dx, float dy)
  21. {
  22.     tex.x+=dx;
  23.     tex.y+=dy;
  24.     
  25.     return tex2D(s0, tex);
  26. }
  27.  
  28. float4 rgb2yuv(float4 rgb)
  29. {
  30.     float4x4 coeffs=
  31.         {
  32.              0.299, 0.587, 0.114, 0.000,
  33.             -0.147,-0.289, 0.436, 0.000,
  34.              0.615,-0.515,-0.100, 0.000,
  35.              0.000, 0.000, 0.000, 0.000
  36.         };
  37.         
  38.     return mul(coeffs,rgb);
  39. }
  40.  
  41. float4 yuv2rgb(float4 yuv)
  42. {
  43.     float4x4 coeffs=
  44.         {
  45.              1.000, 0.000, 1.140, 0.000,
  46.              1.000,-0.395,-0.581, 0.000,
  47.              1.000, 2.032, 0.000, 0.000,
  48.              0.000, 0.000, 0.000, 0.000
  49.         };
  50.     
  51.     return mul(coeffs,yuv);
  52. }
  53.  
  54. float4 main(float2 tex : TEXCOORD0) : COLOR
  55. {
  56.     float dx=1/width;
  57.     float dy=1/height;
  58.     
  59.     float4 yuv00=rgb2yuv(getPixel(tex,-dx,-dy));
  60.     float4 yuv01=rgb2yuv(getPixel(tex,-dx,  0));
  61.     float4 yuv02=rgb2yuv(getPixel(tex,-dx, dy));
  62.     float4 yuv10=rgb2yuv(getPixel(tex,  0,-dy));
  63.     float4 yuv11=rgb2yuv(getPixel(tex,  0,  0));
  64.     float4 yuv12=rgb2yuv(getPixel(tex,  0, dy));
  65.     float4 yuv20=rgb2yuv(getPixel(tex, dx,-dy));
  66.     float4 yuv21=rgb2yuv(getPixel(tex, dx,  0));
  67.     float4 yuv22=rgb2yuv(getPixel(tex, dx, dy));
  68.  
  69.     float4 yuv=
  70.         (yuv00*1+yuv01*2+yuv02*1+
  71.          yuv10*2+yuv11*4+yuv12*2+
  72.          yuv20*1+yuv21*2+yuv22*1)/16;
  73.     
  74.     yuv.r=yuv11.r;
  75.  
  76.     return yuv2rgb(yuv);
  77. }